package cc.rengu.redp.system.utils;

import cc.rengu.redp.common.domain.RedpResponse;
import cc.rengu.redp.common.exception.RedpException;
import cc.rengu.redp.common.utils.ObjectCopyUtil;
import cc.rengu.redp.common.utils.SpringContextUtil;
import cc.rengu.redp.system.domain.FileCharacter;
import cc.rengu.redp.system.domain.FileReg;
import cc.rengu.redp.system.domain.FileRegInfo;
import cc.rengu.redp.system.service.CommonFileRegService;
import cc.rengu.redp.system.service.FileManageService;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

public class FileRegUtil {

    private final static FileManageService fileManageService = SpringContextUtil.getBean(FileManageService.class);

    private final static CommonFileRegService commonFileRegService = SpringContextUtil.getBean(CommonFileRegService.class);

    /**
     * 删除文件
     *
     * @param fullNames 需要删除的文件列表
     * @return
     */
    RedpResponse deleteFileOrDirectory(List<String> fullNames) {
        return fileManageService.deleteFileOrDirectory(fullNames);
    }

    /**
     * 重命名文件
     *
     * @param fullName   路径全名，如： /abc/def/g.pdf
     * @param targetName 修改后名称
     * @return
     */
    RedpResponse renameFileOrDirectory(String fullName, String targetName) {
        return fileManageService.renameFileOrDirectory(fullName, targetName);
    }

    /**
     * 移动文件或目录
     *
     * @param fullNames  需要移动的文件列表
     * @param targetPath 目标路径，如： /abc/def
     * @return
     */
    RedpResponse moveFileOrDirectory(List<String> fullNames, String targetPath) {
        return fileManageService.moveFileOrDirectory(fullNames, targetPath);
    }

    /**
     * 获取简单文件名
     *
     * @param fullName
     * @return
     */
    String getSimpleFileName(String fullName) {
        return fileManageService.getSimpleFileName(fullName);
    }

    /**
     * 读出文件
     *
     * @param fullName
     * @param outputStream
     */
    public static void readoutFile(String fullName, OutputStream outputStream) throws RedpException {
         fileManageService.downloadFile(fullName, outputStream);
    }

    /**
     * 读出文件
     *
     * @param fileId
     * @param outputStream
     */
    public static void readoutFileByFileId(String fileId, OutputStream outputStream) throws RedpException {
        FileReg fileReg = commonFileRegService.getById(fileId);
        if (fileReg == null) {
            return;
        }

        fileManageService.downloadFile(fileReg.getFilePath() + File.separator + fileReg.getFileName(), outputStream);
    }

    /**
     * 注册新文件
     * @param fileName 文件名
     * @param path 子路径
     * @param inputStream 输入流
     * @param fileRegInfo 注册信息（可为空）
     * @return
     */
    public static String regFile(String fileName, String path, InputStream inputStream, FileRegInfo fileRegInfo) throws RedpException {
        fileManageService.uploadFile(fileName, inputStream, false);
        String fullName = path + File.separator + fileName;
        FileCharacter fileCharacter = fileManageService.getFileCharacter(fullName);
        FileReg fileReg = new FileReg();
        fileReg.setFileName(fileName);
        fileReg.setFilePath(path);

        fileReg.setFileDesc(fileRegInfo.getFileDesc());
        fileReg.setAllowRoles(fileRegInfo.getAllowRoles());
        fileReg.setAllowUsers(fileRegInfo.getAllowUsers());
        fileReg.setBizType(fileRegInfo.getBizType());

        if (fileCharacter == null) {
            return null;
        } else {
            fileReg.setCreateTime(fileCharacter.getCreateTime());
            fileReg.setFileSize(fileCharacter.getFileSize());
        }

        try {
            commonFileRegService.save(fileReg);
        } catch (Exception e) {
            fileManageService.deleteFileOrDirectory(fullName);
        }

        return fileReg.getFileId().toString();
    }

    /**
     * 获取文件信息
     * @param fileId
     * @return
     */
    public static FileRegInfo getFileRegInfo(String fileId) {
        FileReg fileReg = commonFileRegService.getById(Long.valueOf(fileId));
        if (fileReg == null) {
            return null;
        }

        return ObjectCopyUtil.copy(fileReg, FileRegInfo.class);
    }
}
